home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / misc / WHDLoad_dev.lha / WHDLoad / Src / programs / SP.asm < prev    next >
Encoding:
Assembly Source File  |  2002-03-27  |  17.1 KB  |  960 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    sp.asm
  3. ;  :Contents.    saves iff picture form dump file created by WHDLoad
  4. ;  :Author.    Bert Jahn
  5. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  6. ;  :Version.    $Id: SP.asm 1.12 2002/03/26 19:55:59 wepl Exp wepl $
  7. ;  :History.    13.07.98 started
  8. ;        03.08.98 reworked for new dump file
  9. ;        12.10.98 cskip added
  10. ;        17.01.99 recompile because error.i changed
  11. ;        15.03.99 cop/k and width/k added
  12. ;        08.08.00 argument for CopStop will be validated now
  13. ;             CopStop added to the copperlist dump
  14. ;        18.03.01 Ctrl-C for copdis added, better error handling
  15. ;        31.03.01 support for ehb pictures added
  16. ;             noop added
  17. ;        29.09.01 NoCopLst/S added
  18. ;             fmode=3 workaround added (Oxygene/Control titel picture)
  19. ;        27.01.02 examines s:whdload.prefs for dump file path
  20. ;        14.03.02 support for lace pictures (Psygore)
  21. ;  :Requires.    OS V37+
  22. ;  :Copyright.    © 1998-2002 Bert Jahn/Philippe Muhlheim, All Rights Reserved
  23. ;  :Language.    68020 Assembler
  24. ;  :Translator.    Barfly 2.9
  25. ;---------------------------------------------------------------------------*
  26. ;##########################################################################
  27.  
  28.     INCDIR    Includes:
  29.     INCLUDE    lvo/exec.i
  30.     INCLUDE    exec/memory.i
  31.     INCLUDE    lvo/dos.i
  32.     INCLUDE    dos/dos.i
  33.     INCLUDE    hardware/custom.i
  34.     
  35.     INCLUDE    whddump.i
  36.     INCLUDE    macros/ntypes.i
  37.  
  38. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  39.  
  40. GL    EQUR    A4        ;a4 ptr to Globals
  41. LOC    EQUR    A5        ;a5 for local vars
  42.  
  43.     STRUCTURE    ArgArray,0
  44.         ULONG    aa_output
  45.         ULONG    aa_cop
  46.         ULONG    aa_copstop
  47.         ULONG    aa_width
  48.         ULONG    aa_height
  49.         ULONG    aa_con0
  50.         ULONG    aa_mod1
  51.         ULONG    aa_mod2
  52.         ULONG    aa_pt1
  53.         ULONG    aa_pt2
  54.         ULONG    aa_pt3
  55.         ULONG    aa_pt4
  56.         ULONG    aa_nocoplst
  57.         LABEL    aa_SIZEOF
  58.  
  59. MAXNAMELEN=256
  60.  
  61.     NSTRUCTURE    Globals,0
  62.         NAPTR    gl_execbase
  63.         NAPTR    gl_dosbase
  64.         NAPTR    gl_rdargs
  65.         NSTRUCT    gl_rdarray,aa_SIZEOF
  66.         NSTRUCT    gl_name,MAXNAMELEN
  67.         NALIGNLONG
  68.         NLABEL    gl_SIZEOF
  69.  
  70. ;##########################################################################
  71.  
  72.     PURE
  73.     OUTPUT    C:SP
  74.     SECTION    "",CODE
  75.     BOPT    O+                ;enable optimizing
  76.     BOPT    OG+                ;enable optimizing
  77.     BOPT    ODd-                ;disable mul optimizing
  78.     BOPT    ODe-                ;disable mul optimizing
  79.     MC68020
  80.  
  81. VER    MACRO
  82.         dc.b    "SP 1.7 "
  83.     DOSCMD    "WDate >t:date"
  84.     INCBIN    "t:date"
  85.         dc.b    " by Wepl,Psygore"
  86.     ENDM
  87.  
  88.         bra    .start
  89.         dc.b    "$VER: "
  90.         VER
  91.         dc.b    " V37+",0
  92.     CNOP 0,2
  93. .start
  94.  
  95. ;##########################################################################
  96.  
  97.         link    GL,#gl_SIZEOF
  98.         move.l    (4).w,(gl_execbase,GL)
  99.         
  100.         move.l    #37,d0
  101.         lea    (_dosname),a1
  102.         move.l    (gl_execbase,GL),a6
  103.         jsr    _LVOOpenLibrary(a6)
  104.         move.l    d0,(gl_dosbase,GL)
  105.         beq    .nodoslib
  106.  
  107.         lea    (_ver),a0
  108.         bsr    _Print
  109.  
  110.         lea    (gl_rdarray,GL),a0
  111.         moveq    #aa_SIZEOF/4-1,d0
  112. .0        clr.l    (a0)+
  113.         dbf    d0,.0
  114.  
  115.         lea    (_template),a0
  116.         move.l    a0,d1
  117.         lea    (gl_rdarray,GL),a0
  118.         move.l    a0,d2
  119.         moveq    #0,d3
  120.         move.l    (gl_dosbase,GL),a6
  121.         jsr    (_LVOReadArgs,a6)
  122.         move.l    d0,(gl_rdargs,GL)
  123.         bne    .argsok
  124.         lea    (_readargs),a0
  125.         bsr    _PrintErrorDOS
  126.         bra    .noargs
  127. .argsok
  128.         move.l    (gl_rdarray+aa_copstop,GL),d0
  129.         beq    .copstop
  130.         move.l    d0,a0
  131.         bsr    _etoi
  132.         move.l    d0,(gl_rdarray+aa_copstop,GL)
  133.         ble    .copstoperr
  134.         tst.b    (a0)
  135.         beq    .copstop
  136. .copstoperr    lea    (_badcopstop),a0
  137.         bsr    _Print
  138.         bra    .opend
  139. .copstop
  140.  
  141.         bsr    _Main
  142. .opend
  143.         move.l    (gl_rdargs,GL),d1
  144.         move.l    (gl_dosbase,GL),a6
  145.         jsr    (_LVOFreeArgs,a6)
  146. .noargs
  147.         move.l    (gl_dosbase,GL),a1
  148.         move.l    (gl_execbase,GL),a6
  149.         jsr    (_LVOCloseLibrary,a6)
  150. .nodoslib
  151.         unlk    GL
  152.         moveq    #0,d0
  153.         rts
  154.  
  155. ;##########################################################################
  156.  
  157. _getname    movem.l    d2-d7,-(a7)
  158.         pea    _name
  159.  
  160.     ;load global configuration
  161.         lea    (_cfgname),a0
  162.         move.l    a0,d1
  163.         move.l    #MODE_OLDFILE,d2    ;mode
  164.         move.l    (gl_dosbase,GL),a6    ;A6 = dosbase
  165.         jsr    (_LVOOpen,a6)
  166.         move.l    d0,d6            ;D6 = fh
  167.         beq    .g_end
  168.         move.l    #MAXNAMELEN,d5        ;D5 = buffer size
  169.         sub.l    d5,a7            ;A7 = buffer
  170.  
  171. .g_next        move.l    d6,d1            ;fh
  172.         move.l    a7,d2            ;buffer
  173.         move.l    d5,d3            ;buffer size
  174.         bsr    _FGetS
  175.         tst.l    d0
  176.         beq    .g_free
  177.     ;remove comments
  178.         move.l    a7,a0
  179.         move.l    a7,a1
  180. .g_sn        move.b    (a0)+,d0
  181.         cmp.b    #";",d0
  182.         bne    .g_sw
  183.         moveq    #0,d0
  184. .g_sw        move.b    d0,(a1)+
  185.         bne    .g_sn
  186.     ;remove space and tabs at end of line
  187.         subq.l    #1,a1
  188. .g_sl        subq.l    #1,a1
  189.         cmp.l    a1,a7
  190.         bhi    .g_sc
  191.         cmp.b    #" ",(a1)
  192.         beq    .g_sk
  193.         cmp.b    #"    ",(a1)
  194.         bne    .g_sc
  195. .g_sk        clr.b    (a1)
  196.         bra    .g_sl
  197. .g_sc
  198.     ;check for contens
  199.         tst.b    (a7)            ;empty line
  200.         beq    .g_next
  201.  
  202.         lea    _cfgid,a0
  203.         move.l    a7,a1            ;actual global cfg line
  204.         bsr    _StrNCaseCmp
  205.         tst.l    d0
  206.         bne    .g_next
  207.         
  208.         lea    (13,a7),a0
  209.         lea    (gl_name,GL),a1
  210.         move.l    a1,(a7,d5.l)
  211. .cpy        move.b    (a0)+,(a1)+
  212.         bne    .cpy
  213.  
  214.         lea    _name,a0
  215.         lea    (gl_name,GL),a1
  216.         move.l    #MAXNAMELEN,d0
  217.         bsr    _AppendString
  218.  
  219. .g_free        add.l    d5,a7            ;free buffer
  220.         move.l    d6,d1
  221.         jsr    (_LVOClose,a6)
  222. .g_end                        ;end global config
  223.         move.l    (a7)+,a0
  224.         movem.l    (a7)+,_MOVEMREGS
  225.         rts
  226.  
  227. ;##########################################################################
  228.  
  229.     NSTRUCTURE    local_main,0
  230.         NAPTR    lm_fileptr
  231.         NULONG    lm_filesize
  232.         NAPTR    lm_header
  233.         NAPTR    lm_cust
  234.         NAPTR    lm_mem
  235.         NULONG    lm_cmapsize
  236.         NULONG    lm_bodysize
  237.         NULONG    lm_destptr
  238.         NSTRUCT    lm_colors,256*3
  239.         NWORD    lm_widthskip        ;amount of bytes which are displayed
  240.                         ;but will not be written to dest
  241.         NBYTE    lm_ehb            ;extra half brite
  242.         NBYTE    lm_lace            ;lace
  243.         NALIGNLONG
  244.         NLABEL    lm_SIZEOF
  245.  
  246. _Main        movem.l    d2-d7/a2-a3/a6,-(a7)
  247.         link    LOC,#lm_SIZEOF
  248.         
  249.         lea    (lm_colors,LOC),a0
  250.         moveq    #256*3/8-1,d0
  251. .clr4        clr.l    (a0)+
  252.         clr.l    (a0)+
  253.         dbf    d0,.clr4
  254.  
  255.         bsr    _getname
  256.         bsr    _LoadFileMsg
  257.         move.l    d1,(lm_filesize,LOC)
  258.         move.l    d0,(lm_fileptr,LOC)
  259.         beq    .afilefree
  260.  
  261.         clr.l    (lm_mem,LOC)
  262.         clr.l    (lm_cust,LOC)
  263.         clr.l    (lm_header,LOC)
  264.  
  265.         cmp.l    #20,d1
  266.         blt    .filefree
  267.  
  268.         move.l    d0,a0
  269.         cmp.l    #"FORM",(a0)+
  270.         bne    .filefree
  271.         subq.l    #8,d1
  272.         cmp.l    (a0)+,d1
  273.         bne    .filefree
  274.         cmp.l    #ID_WHDD,(a0)+
  275.         bne    .filefree
  276.         subq.l    #4,d1
  277. .idn        move.l    (a0)+,d0
  278.         move.l    (a0)+,d2
  279.         subq.l    #8,d1
  280.         bcs    .filefree
  281.         cmp.l    #ID_CUST,d0
  282.         bne    .id1
  283.         move.l    a0,(lm_cust,LOC)
  284. .id1        cmp.l    #ID_MEM,d0
  285.         bne    .id2
  286.         move.l    a0,(lm_mem,LOC)
  287. .id2        cmp.l    #ID_HEAD,d0
  288.         bne    .id3
  289.         move.l    a0,(lm_header,LOC)
  290. .id3        add.l    d2,a0
  291.         sub.l    d2,d1
  292.         bcs    .filefree
  293.         bne    .idn
  294.  
  295.         tst.l    (lm_mem,LOC)
  296.         beq    .filefree
  297.         tst.l    (lm_cust,LOC)
  298.         beq    .filefree
  299.         tst.l    (lm_header,LOC)
  300.         beq    .filefree
  301.  
  302.         move.l    (lm_header,LOC),a0
  303.         move.l    (wdh_BaseMemSize,a0),-(a7)
  304.         pea    (_mem_text)
  305.         bsr    _pf
  306.         addq.l    #8,a7
  307.  
  308.         move.l    (lm_cust,LOC),a3    ;A3 = custom
  309.  
  310.     ;copy color entries
  311.         lea    (color,a3),a0
  312.         lea    (lm_colors,LOC),a1
  313.         moveq    #31,d0
  314. .sc2        move.w    (a0)+,d1
  315.         bfextu    d1{20:4},d2
  316.         mulu    #$11,d2
  317.         move.b    d2,(a1)+
  318.         bfextu    d1{24:4},d2
  319.         mulu    #$11,d2
  320.         move.b    d2,(a1)+
  321.         bfextu    d1{28:4},d2
  322.         mulu    #$11,d2
  323.         move.b    d2,(a1)+
  324.         dbf    d0,.sc2
  325.  
  326.     ;print coplc's
  327.         movem.l    (cop1lc,a3),d0-d1
  328.         movem.l    d0-d1,-(a7)
  329.         pea    (_cop_text)
  330.         bsr    _pf
  331.         add.w    #12,a7
  332.     ;overwrite with arguments
  333.         move.l    (gl_rdarray+aa_cop,GL),d0
  334.         beq    .ncop
  335.         move.l    d0,a0
  336.         bsr    _etoi
  337.         move.l    d0,(cop1lc,a3)
  338. .ncop
  339.     ;dump copper lists
  340.         tst.l    (gl_rdarray+aa_nocoplst,GL)
  341.         bne    .nocoplst
  342.         bsr    _cdis
  343.         tst.l    d0
  344.         beq    .cdis_fail
  345. .nocoplst
  346.     ;move cop writes to custom table
  347.         bsr    _copwrite
  348.  
  349.     ;overwrite with arguments
  350.         bsr    _withargs
  351.  
  352.     ;depth
  353.         bfextu    (bplcon0,a3){1:3},d6
  354.         bne    .3
  355.         moveq    #8,d6            ;D6 = depth
  356. .3
  357.     ;height
  358.         bfextu    (diwstrt,a3){0:8},d0
  359.         bfextu    (diwstop,a3){0:8},d5
  360.         tst.b    d5
  361.         bmi    .4
  362.         add.w    #256,d5
  363. .4        sub.l    d0,d5            ;D5 = height
  364.  
  365.     ;check lace
  366.         btst    #2,(bplcon0+1,a3)
  367.         sne    (lm_lace,LOC)
  368.         beq    .nolace
  369.         add.l    d5,d5            ;height*2
  370. .nolace
  371.     ;width
  372.     ifeq 1
  373.         bfextu    (diwstrt,a3){8:8},d0
  374.         bfextu    (diwstop,a3){8:8},d4
  375.         add.w    #256,d4
  376.         sub.l    d0,d4            ;D4 = width
  377.     else
  378.         move.w    (ddfstop,a3),d4
  379.         sub.w    (ddfstrt,a3),d4
  380.         bfextu    (fmode,a3){14:2},d0
  381.         cmp.w    #3,d0
  382.         bne    .ddf1
  383.         mulu    #3,d4
  384.         addq.w    #8,d4
  385.         bra    .ddf2
  386. .ddf1        addq.w    #8,d4
  387.         add.w    d4,d4            ;D4 = width
  388. .ddf2
  389.     endc
  390.         tst.b    (bplcon0,a3)
  391.         bpl    .lores
  392.         add.w    d4,d4
  393. .lores
  394.         move.l    (gl_rdarray+aa_height,GL),d0
  395.         beq    .h
  396.         move.l    d0,a0
  397.         bsr    _etoi
  398.         move.l    d0,d5
  399. .h
  400.         move.w    d4,(lm_widthskip,LOC)
  401.         move.l    (gl_rdarray+aa_width,GL),d0
  402.         beq    .w
  403.         move.l    d0,a0
  404.         bsr    _etoi
  405.         move.l    d0,d4
  406. .w        move.w    (lm_widthskip,LOC),d0
  407.         sub.w    d4,d0
  408.         asr.w    #3,d0
  409.         move.w    d0,(lm_widthskip,LOC)
  410.  
  411.     ;check ehb
  412.         move.w    (bplcon0,a3),d0
  413.         and.w    #%1111110001010000,d0
  414.         cmp.w    #%0110000000000000,d0    ;HIRES=HAM=DPF=SHRES=0 depth=6
  415.         seq    (lm_ehb,LOC)
  416.         btst    #2,(bplcon2,a3)        ;KILLEHB
  417.         beq    .noehb
  418.         sf    (lm_ehb,LOC)
  419. .noehb
  420.  
  421.     ;calc pic size
  422.     ;FORM+ILBM
  423.         moveq    #12,d7
  424.     ;BMHD
  425.         add.l    #28,d7
  426.     ;CAMG
  427.         add.l    #12,d7
  428.     ;CMAP
  429.         moveq    #1,d0
  430.         lsl.l    d6,d0
  431.         tst.b    (lm_ehb,LOC)
  432.         beq    .noehb2
  433.         moveq    #1<<5,d0
  434. .noehb2        mulu    #3,d0
  435.         move.l    d0,(lm_cmapsize,LOC)
  436.         add.l    d0,d7
  437.         addq.l    #8,d7
  438.     ;BODY
  439.         move.l    d4,d0
  440.         add.w    #15,d0
  441.         lsr.l    #4,d0
  442.         add.l    d0,d0
  443.         mulu    d6,d0
  444.         mulu    d5,d0
  445.         move.l    d0,(lm_bodysize,LOC)
  446.         add.l    d0,d7
  447.         addq.l    #8,d7
  448.  
  449.         movem.l    d4-d6,-(a7)
  450.         pea    _dim_text
  451.         bsr    _pf
  452.         add.w    #16,a7
  453.         
  454.         tst.w    d4
  455.         beq    .adestfree
  456.         tst.w    d5
  457.         beq    .adestfree
  458.         tst.w    d6
  459.         beq    .adestfree
  460.  
  461.     ;get mem
  462.         move.l    d7,d0
  463.         moveq    #MEMF_ANY,d1
  464.         move.l    (gl_execbase,GL),a6
  465.         jsr    (_LVOAllocVec,a6)
  466.         move.l    d0,(lm_destptr,LOC)
  467.         bne    .memok
  468.         moveq    #0,d0
  469.         lea    (_nomem),a0
  470.         sub.l    a1,a1
  471.         bsr    _PrintError
  472.         bra    .adestfree
  473. .memok
  474.         move.l    d0,a2
  475.         move.l    #"FORM",(a2)+
  476.         move.l    d7,(a2)
  477.         subq.l    #8,(a2)+
  478.         move.l    #"ILBM",(a2)+
  479.     ;BMHD
  480.         move.l    #"BMHD",(a2)+
  481.         move.l    #20,(a2)+
  482.         move.w    d4,(a2)+
  483.         move.w    d5,(a2)+
  484.         clr.l    (a2)+            ;xpos,ypos
  485.         move.w    d6,d0
  486.         move.b    d0,(a2)+
  487.         clr.b    (a2)+            ;mask
  488.         clr.b    (a2)+            ;compression
  489.         clr.b    (a2)+            ;pad
  490.         clr.w    (a2)+            ;trans col
  491.         move.b    #10,(a2)+        ;x aspect
  492.         move.b    #11,(a2)+        ;y aspect
  493.         move.w    d4,(a2)+        ;screen
  494.         move.w    d5,(a2)+
  495.     ;CAMG
  496.         move.l    #"CAMG",(a2)+
  497.         move.l    #4,(a2)+
  498.         clr.w    (a2)+
  499.         move.w    (bplcon0,a3),(a2)+
  500.     ;CMAP
  501.         move.l    #"CMAP",(a2)+
  502.         move.l    (lm_cmapsize,LOC),d2
  503.         move.l    d2,(a2)+
  504.         lea    (lm_colors,LOC),a0
  505. .cmap        move.w    (a0)+,(a2)+
  506.         subq.l    #2,d2
  507.         bne    .cmap
  508.     ;BODY
  509.         move.l    #"BODY",(a2)+
  510.         move.l    (lm_bodysize,LOC),(a2)+
  511.         moveq    #0,d3            ;d3 = plane
  512.  
  513.         move.w    d5,d3            ;height
  514.         lsr.w    #1,d3
  515.         bcs    .odd
  516.  
  517. .9        lea    (bplpt,a3),a0
  518.         move.w    d6,d1            ;depth
  519. .8        move.l    (a0),a1
  520.         tst.b    (lm_lace,LOC)
  521.         beq    .nolace2
  522.         sub.w    (bpl1mod,a3),a1
  523. .nolace2
  524.         add.l    (lm_mem,LOC),a1
  525.         move.w    d4,d0            ;width
  526.         add.w    #15,d0
  527.         lsr.w    #4,d0
  528. .7        move.w    (a1)+,(a2)+
  529.         subq.w    #1,d0
  530.         bne    .7
  531.         sub.l    (lm_mem,LOC),a1
  532.         move.l    a1,(a0)+
  533.         subq.w    #1,d1
  534.         bne    .8
  535.         
  536.         movem.w    (bpl1mod,a3),d0-d1
  537.         lea    (bplpt,a3),a0
  538.         moveq    #4-1,d2
  539. .6        move.l    (a0),a1
  540.         tst.b    (lm_lace,LOC)
  541.         bne    .lace3
  542.         add.w    d0,a1
  543. .lace3
  544.         add.w    (lm_widthskip,LOC),a1
  545.         move.l    a1,(a0)+
  546.         move.l    (a0),a1
  547.         tst.b    (lm_lace,LOC)
  548.         bne    .lace4
  549.         add.w    d1,a1
  550. .lace4
  551.         add.w    (lm_widthskip,LOC),a1
  552.         move.l    a1,(a0)+
  553.         dbf    d2,.6
  554. .odd
  555.         lea    (bplpt,a3),a0
  556.         move.w    d6,d1            ;depth
  557. .8a        move.l    (a0),a1
  558.         add.l    (lm_mem,LOC),a1
  559.         move.w    d4,d0            ;width
  560.         add.w    #15,d0
  561.         lsr.w    #4,d0
  562. .7a        move.w    (a1)+,(a2)+
  563.         subq.w    #1,d0
  564.         bne    .7a
  565.         sub.l    (lm_mem,LOC),a1
  566.         move.l    a1,(a0)+
  567.         subq.w    #1,d1
  568.         bne    .8a
  569.         
  570.         movem.w    (bpl1mod,a3),d0-d1
  571.         lea    (bplpt,a3),a0
  572.         moveq    #4-1,d2
  573. .6a        move.l    (a0),a1
  574.         add.w    d0,a1
  575.         add.w    (lm_widthskip,LOC),a1
  576.         move.l    a1,(a0)+
  577.         move.l    (a0),a1
  578.         add.w    d1,a1
  579.         add.w    (lm_widthskip,LOC),a1
  580.         move.l    a1,(a0)+
  581.         dbf    d2,.6a
  582.         
  583.         tst.w    d3
  584.         beq    .end
  585.         subq.w    #1,d3
  586.         bne    .9
  587. .end
  588.         move.l    d7,d0
  589.         move.l    (lm_destptr,LOC),a0
  590.         move.l    (gl_rdarray+aa_output,GL),d1
  591.         move.l    d1,a1
  592.         bsr    _SaveFileMsg
  593.  
  594.         move.l    (lm_destptr,LOC),a1
  595.         move.l    (gl_execbase,GL),a6
  596.         jsr    (_LVOFreeVec,a6)
  597. .adestfree
  598. .cdis_fail
  599. .filefree
  600.         move.l    (lm_fileptr,LOC),a1
  601.         move.l    (gl_execbase,GL),a6
  602.         jsr    (_LVOFreeVec,a6)
  603. .afilefree
  604.         unlk    LOC
  605.         movem.l    (a7)+,d2-d7/a2-a3/a6
  606.         rts
  607.  
  608. ;##########################################################################
  609.  
  610. _cdis        moveq    #0,d4            ;d4 = list number
  611.         move.l    (cop1lc,a3),d5        ;d5 = lc1
  612.         move.l    (cop2lc,a3),d6        ;d6 = lc2
  613.  
  614. .j1        move.l    d5,a0
  615. .nlc        addq.l    #1,d4
  616.         add.l    (lm_mem,LOC),a0
  617.         
  618.         move.l    d4,-(a7)
  619.         pea    (_copdump_text)
  620.         bsr    _pf
  621.         add.l    #8,a7
  622.  
  623. .next
  624.     ;check Ctrl-C
  625.         move.l    a0,-(a7)
  626.         bsr    _CheckBreak
  627.         move.l    (a7)+,a0
  628.         tst.l    d0
  629.         bne    .fail
  630.         
  631.     ;check memory bounds
  632.         move.l    (lm_mem,LOC),d0
  633.         cmp.l    a0,d0
  634.         bhi    .fail_mem
  635.         move.l    (lm_header,LOC),a1
  636.         add.l    (wdh_BaseMemSize,a1),d0
  637.         subq.l    #4,d0
  638.         cmp.l    a0,d0
  639.         blo    .fail_mem
  640.  
  641.     ;check copstop
  642.         move.l    a0,d0
  643.         sub.l    (lm_mem,LOC),d0
  644.         cmp.l    (gl_rdarray+aa_copstop,GL),d0
  645.         beq    .copstop
  646.  
  647.         bsr    _pa            ;print address
  648.         cmp.l    #-2,(a0)
  649.         beq    .e
  650.         movem.w    (a0)+,d0-d1
  651.         btst    #0,d0
  652.         beq    .m
  653.         btst    #0,d1
  654.         beq    .w
  655.  
  656.     ;skip
  657. .s        lsr.w    #1,d0
  658.         ext.l    d0
  659.         ror.l    #7,d0
  660.         lsl.w    #7,d0
  661.         lsr.l    #7,d0
  662.         move.l    d0,-(a7)
  663.         pea    .cskip
  664.         bsr    _pf
  665.         addq.l    #8,a7
  666.         bra    .next
  667.  
  668.     ;wait
  669. .w        lsr.w    #1,d0
  670.         ext.l    d0
  671.         ror.l    #7,d0
  672.         lsl.w    #7,d0
  673.         lsr.l    #7,d0
  674.         move.l    d0,-(a7)
  675.         pea    .cwait
  676.         bsr    _pf
  677.         addq.l    #8,a7
  678.         bra    .next
  679.  
  680.     ;move
  681. .m        addq.w    #2,d0
  682.         cmp.w    (a0),d0
  683.         beq    .lm
  684.         subq.w    #2,d0
  685.         move.w    d0,-(a7)
  686.         move.w    d1,-(a7)
  687.         pea    .cmove
  688.         bsr    _pf
  689.         addq.l    #8,a7
  690.         bsr    _pc
  691.         cmp.w    #noop,d0
  692.         bhi    .fail_adr
  693.         cmp.w    #copjmp1,d0
  694.         beq    .j1
  695.         cmp.w    #copjmp2,d0
  696.         bne    .next
  697.         move.l    d6,a0
  698.         bra    .nlc
  699.  
  700.     ;move long
  701. .lm        subq.w    #2,d0
  702.         addq.l    #2,a0
  703.         move.w    d0,d2
  704.         move.w    d1,d0
  705.         move.w    (a0)+,d1
  706.         movem.w    d0-d3,-(a7)
  707.         cmp.w    #cop1lc,d2
  708.         bne    .lm1
  709.         move.l    (a7),d5
  710. .lm1        cmp.w    #cop2lc,d2
  711.         bne    .lm2
  712.         move.l    (a7),d6
  713. .lm2        pea    .clmove
  714.         bsr    _pf
  715.         add.w    #12,a7
  716.         move.w    d2,d0
  717.         bsr    _pc
  718.         bra    .next
  719.  
  720. .e        pea    .cend
  721.         bsr    _p
  722.  
  723. .q        moveq    #-1,d0
  724.         rts
  725. .copstop    lea    (.cs),a0
  726.         bsr    _Print
  727.         bra    .q
  728.  
  729. .fail        moveq    #0,d0
  730.         rts
  731. .fail_mem    lea    (.mem),a0
  732.         bsr    _Print
  733.         bra    .fail
  734. .fail_adr    lea    (.adr),a0
  735.         bsr    _Print
  736.         bra    .fail
  737.  
  738. .cend        dc.b    "CEND",10,0
  739. .cmove        dc.b    "CMOVE    #$%04x,$%04x    ",0
  740. .clmove        dc.b    "CLMOVE    #$%08lx,$%04x",0
  741. .cwait        dc.b    "CWAIT    %d,%d",10,0
  742. .cskip        dc.b    "CSKIP    %d,%d",10,0
  743. .mem        dc.b    "copperlist outside BaseMem!",10,0
  744. .adr        dc.b    "invalid CMOVE destination!",10,0
  745. .cs        dc.b    "*** copstop ***",10,0
  746.     EVEN
  747.  
  748. ;print address
  749. _pa        movem.l    d0-d1/a0-a1,-(a7)
  750.         sub.l    (lm_mem,LOC),a0
  751.         move.l    a0,-(a7)
  752.         pea    .1
  753.         bsr    _pf
  754.         addq.l    #8,a7
  755.         movem.l    (a7)+,_MOVEMREGS
  756.         rts
  757. .1        dc.b    "$%06lx ",0
  758.     EVEN
  759.  
  760. ;print string
  761. _p        movem.l    d0-d1/a0-a1,-(a7)
  762.         move.l    (20,a7),a0
  763.         bsr    _PrintArgs
  764.         movem.l    (a7)+,_MOVEMREGS
  765.         rtd    #4
  766.  
  767. ;printf
  768. _pf        movem.l    d0-d1/a0-a1,-(a7)
  769.         move.l    (20,a7),a0
  770.         lea    (24,a7),a1
  771.         bsr    _PrintArgs
  772.         movem.l    (a7)+,_MOVEMREGS
  773.         rts
  774.  
  775. ;print custom
  776. _pc        movem.l    d0-d1/a0-a1,-(a7)
  777.         bsr    _GetCustomName
  778.         move.l    d0,-(a7)
  779.         pea    .2
  780.         bne    .1
  781.         addq.l    #4,a7
  782.         pea    .3
  783. .1        bsr    _pf
  784.         addq.l    #8,a7
  785.         movem.l    (a7)+,_MOVEMREGS
  786.         rts
  787.  
  788. .2        dc.b    "    ;%s"
  789. .3        dc.b    10,0
  790.     EVEN
  791.  
  792. ;##########################################################################
  793.  
  794. _copwrite    moveq    #-1,d5
  795.         move.l    (gl_rdarray+aa_copstop,GL),d0
  796.         beq    .cse
  797.         move.l    d0,d5
  798.         add.l    (lm_mem,LOC),d5
  799. .cse
  800. .j1        move.l    (cop1lc,a3),a0
  801. .off        add.l    (lm_mem,LOC),a0
  802.  
  803. .c1n        cmp.l    #-2,(a0)
  804.         beq    .c1e
  805.         cmp.l    d5,a0
  806.         beq    .c1e
  807.         movem.w    (a0)+,d0-d1
  808.         btst    #0,d0
  809.         bne    .c1n
  810.         cmp.w    #copjmp1,d0
  811.         beq    .j1
  812.         cmp.w    #copjmp2,d0
  813.         bne    .c
  814.         move.l    (cop2lc,a3),a0
  815.         bra    .off
  816.         
  817. .c        cmp.w    #color,d0
  818.         blo    .c1u
  819.         cmp.w    #color+62,d0
  820.         bhi    .c1u
  821.  
  822.     ;color register
  823.         bfextu    (bplcon3,a3){0:3},d2    ;bank
  824.         mulu    #256/8*3,d2
  825.         lea    (lm_colors.w,LOC,d2.w),a1
  826.         sub.w    #color,d0
  827.         lsr.w    #1,d0
  828.         mulu    #3,d0
  829.         add.w    d0,a1
  830.         bfextu    d1{20:4},d2
  831.         mulu    #$11,d2
  832.         bfextu    d1{24:4},d3
  833.         mulu    #$11,d3
  834.         bfextu    d1{28:4},d4
  835.         mulu    #$11,d4
  836.         btst    #9,(bplcon3,a3)        ;LOCT ?
  837.         bne    .c1l
  838.         move.b    d2,(a1)+
  839.         move.b    d3,(a1)+
  840.         move.b    d4,(a1)
  841.         bra    .c1n
  842. .c1l        bfins    d2,(a1){4:4}
  843.         bfins    d3,(1,a1){4:4}
  844.         bfins    d4,(2,a1){4:4}
  845.         bra    .c1n
  846.  
  847. .c1u        move.w    d1,(a3,d0.w)
  848.         or.w    #$8080,($200.w,a3,d0.w)
  849.         bra    .c1n
  850. .c1e
  851.         rts
  852.  
  853. ;##########################################################################
  854.  
  855. _withargs
  856.         move.l    (gl_rdarray+aa_con0,GL),d0
  857.         beq    .0
  858.         move.l    d0,a0
  859.         bsr    _etoi
  860.         move.w    d0,(bplcon0,a3)
  861. .0
  862.         move.l    (gl_rdarray+aa_mod1,GL),d0
  863.         beq    .1
  864.         move.l    d0,a0
  865.         bsr    _etoi
  866.         move.w    d0,(bpl1mod,a3)
  867. .1        move.l    (gl_rdarray+aa_mod2,GL),d0
  868.         beq    .2
  869.         move.l    d0,a0
  870.         bsr    _etoi
  871.         move.w    d0,(bpl2mod,a3)
  872. .2
  873.         move.l    (gl_rdarray+aa_pt1,GL),d0
  874.         beq    .p1
  875.         move.l    d0,a0
  876.         bsr    _etoi
  877.         move.l    d0,(bplpt,a3)
  878. .p1        move.l    (gl_rdarray+aa_pt2,GL),d0
  879.         beq    .p2
  880.         move.l    d0,a0
  881.         bsr    _etoi
  882.         move.l    d0,(bplpt+4,a3)
  883. .p2        move.l    (gl_rdarray+aa_pt3,GL),d0
  884.         beq    .p3
  885.         move.l    d0,a0
  886.         bsr    _etoi
  887.         move.l    d0,(bplpt+8,a3)
  888. .p3        move.l    (gl_rdarray+aa_pt4,GL),d0
  889.         beq    .p4
  890.         move.l    d0,a0
  891.         bsr    _etoi
  892.         move.l    d0,(bplpt+12,a3)
  893. .p4
  894.         rts
  895.  
  896. ;##########################################################################
  897.  
  898.     INCDIR    Sources:
  899.     INCLUDE    dosio.i
  900.         PrintArgs
  901.         Print
  902.         CheckBreak
  903.         FGetS
  904.     INCLUDE    error.i
  905.         PrintErrorDOS
  906.     INCLUDE    files.i
  907.         LoadFileMsg
  908.         SaveFileMsg
  909.     INCLUDE    hardware.i
  910.         GetCustomName
  911.     INCLUDE    strings.i
  912.         etoi
  913.         StrNCaseCmp
  914.         AppendString
  915.  
  916. ;##########################################################################
  917.  
  918. _cfgname    dc.b    "s:whdload.prefs",0
  919. _cfgid        dc.b    "coredumppath=",0
  920. _name        dc.b    ".whdl_dump",0
  921.  
  922. _mem_text    dc.b    "BaseMemSize=$%lx",10,0
  923. _cop_text    dc.b    "cop1lc=$%lx cop2lc=$%lx",10,0
  924. _copdump_text    dc.b    "*** copperlist %ld ***",10,0
  925. _badci_text    dc.b    "bad copper instruction: %8lx",10,0
  926. _dim_text    dc.b    "width=%ld height=%ld depth=%ld",10,0
  927.  
  928. ; Errors
  929. _nomem        dc.b    "not enough free store",0
  930. _badcopstop    dc.b    "invalid argument for CopStop",10,0
  931.  
  932. ; Operationen
  933. _readargs    dc.b    "read arguments",0
  934.  
  935. ;subsystems
  936. _dosname    dc.b    "dos.library",0
  937.  
  938. _template    dc.b    "OutputFile/A"
  939.         dc.b    ",Cop/K"
  940.         dc.b    ",CS=CopStop/K"
  941.         dc.b    ",Width/K"
  942.         dc.b    ",Height/K"
  943.         dc.b    ",con0/K"
  944.         dc.b    ",mod1/K"
  945.         dc.b    ",mod2/K"
  946.         dc.b    ",pt1/K"
  947.         dc.b    ",pt2/K"
  948.         dc.b    ",pt3/K"
  949.         dc.b    ",pt4/K"
  950.         dc.b    ",NoCopLst/S"
  951.         dc.b    0
  952.  
  953. _ver        VER
  954.         dc.b    10,0
  955.  
  956. ;##########################################################################
  957.  
  958.     END
  959.  
  960.